{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<matplotlib.pyplot._IonContext at 0x22841260a00>"
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import time\n",
    "import os\n",
    "import copy\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "from torch.optim import lr_scheduler\n",
    "\n",
    "from torchvision import datasets\n",
    "import torchvision.transforms as transforms\n",
    "from torch.utils.data.sampler import SubsetRandomSampler\n",
    "import torchvision\n",
    "from torchvision import datasets, models, transforms\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "plt.ion()   # interactive mode\n",
    "\n",
    "# from Datasets import Generate_Dataloader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "lr = 1e-2\n",
    "momentum = 0.9\n",
    "weight_decay = 1e-4\n",
    "\n",
    "arch = 'vgg16_bn_ft'\n",
    "\n",
    "gpu = 0\n",
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = '1'\n",
    "\n",
    "num_class = 10\n",
    "\n",
    "print_freq = 50\n",
    "\n",
    "\n",
    "# number of subprocesses to use for data loading\n",
    "num_workers = 0\n",
    "# 每批加载16张图片\n",
    "batch_size = 16\n",
    "# percentage of training set to use as validation\n",
    "valid_size = 0.2\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Life is short, find a GPU...\n"
     ]
    }
   ],
   "source": [
    "if torch.cuda.is_available():\n",
    "    print(\"Luckily you have at least a GPU!\")\n",
    "    device = torch.device(\"cuda:0\")\n",
    "else:\n",
    "    print(\"Life is short, find a GPU...\")\n",
    "    device = torch.device(\"cpu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# Load ft model\n",
    "model_name = 'vgg16'\n",
    "if model_name == 'vgg16':\n",
    "    model = models.vgg16(pretrained=True)\n",
    "    model.classifier[6] = nn.Linear(in_features=model.classifier[6].in_features, out_features=num_class, bias=True)\n",
    "    for name, module in model.named_modules():\n",
    "        for param in module.parameters():\n",
    "            param.requires_grad = False\n",
    "    for param in model.classifier[6].parameters():\n",
    "        param.requires_grad = True\n",
    "    assert model.classifier[6].weight.requires_grad\n",
    "    assert not model.classifier[3].weight.requires_grad\n",
    "    \n",
    "    feature_space = models.vgg16(pretrained=True)\n",
    "    feature_space.classifier = nn.Sequential(*list(feature_space.classifier.children())[:-2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "# 将数据转换为torch.FloatTensor，并标准化。\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n",
    "    ])\n",
    "# 选择训练集与测试集的数据\n",
    "train_data = datasets.CIFAR10('data', train=True,\n",
    "                              download=True, transform=transform)\n",
    "\n",
    "# obtain training indices that will be used for validation\n",
    "num_train = 2000\n",
    "indices = list(range(num_train))\n",
    "np.random.shuffle(indices)\n",
    "split = int(np.floor(valid_size * num_train))\n",
    "train_idx, valid_idx = indices[split:], indices[:split]\n",
    "\n",
    "# define samplers for obtaining training and validation batches\n",
    "train_sampler = SubsetRandomSampler(train_idx)\n",
    "valid_sampler = SubsetRandomSampler(valid_idx)\n",
    "\n",
    "# prepare data loaders (combine dataset and sampler)\n",
    "train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size,\n",
    "    sampler=train_sampler, num_workers=num_workers)\n",
    "val_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size,\n",
    "    sampler=valid_sampler, num_workers=num_workers)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def imshow(inp, title=None):\n",
    "    \"\"\"Imshow for Tensor.\"\"\"\n",
    "    inp = inp.numpy().transpose((1, 2, 0))\n",
    "    mean = np.array([0.485, 0.456, 0.406])\n",
    "    std = np.array([0.229, 0.224, 0.225])\n",
    "    inp = std * inp + mean\n",
    "    inp = np.clip(inp, 0, 1)\n",
    "    plt.imshow(inp)\n",
    "    if title is not None:\n",
    "        plt.title(title)\n",
    "    plt.pause(0.001)  # pause a bit so that plots are updated"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Get a batch of training data\n",
    "inputs, classes = next(iter(train_loader))\n",
    "# Make a grid from batch\n",
    "out = torchvision.utils.make_grid(inputs)\n",
    "\n",
    "imshow(out)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "class AverageMeter(object):\n",
    "    \"\"\"Computes and stores the average and current value\"\"\"\n",
    "    def __init__(self):\n",
    "        self.reset()\n",
    "\n",
    "    def reset(self):\n",
    "        self.val = 0\n",
    "        self.avg = 0\n",
    "        self.sum = 0\n",
    "        self.count = 0\n",
    "\n",
    "    def update(self, val, n=1):\n",
    "        self.val = val\n",
    "        self.sum += val * n\n",
    "        self.count += n\n",
    "        self.avg = self.sum / self.count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def train(train_loader, model, criterion, optimizer, epoch, dm = None):\n",
    "    batch_time = AverageMeter()\n",
    "    data_time = AverageMeter()\n",
    "    losses = AverageMeter()\n",
    "    top1 = AverageMeter()\n",
    "    # top5 = AverageMeter()\n",
    "\n",
    "    # switch to train mode\n",
    "    model.train()\n",
    "\n",
    "    end = time.time()\n",
    "    for i, (inputs, labels) in enumerate(train_loader):\n",
    "        # measure data loading time\n",
    "        data_time.update(time.time() - end)\n",
    "        \n",
    "        if dm!=None:\n",
    "            dm.get(inputs)\n",
    "\n",
    "        inputs = inputs.to(device)\n",
    "        labels = labels.to(device)\n",
    "\n",
    "        # compute output\n",
    "        outputs = model(inputs)\n",
    "        loss = criterion(outputs, labels)\n",
    "        _, preds = torch.max(outputs, 1)\n",
    "\n",
    "        # measure accuracy and record loss            \n",
    "        losses.update(loss.item(), inputs.size(0))\n",
    "        top1.update(torch.sum(preds == labels.data).double()/inputs.size(0), inputs.size(0))\n",
    "\n",
    "        # compute gradient and do SGD step\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "        # measure elapsed time\n",
    "        batch_time.update(time.time() - end)\n",
    "        end = time.time()\n",
    "\n",
    "        if i % print_freq == 0:\n",
    "            print('Epoch: [{0}][{1}/{2}]\\t'\n",
    "              'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\\t'\n",
    "              'Data {data_time.val:.3f} ({data_time.avg:.3f})\\t'\n",
    "              'Loss {loss.val:.4f} ({loss.avg:.4f})\\t'\n",
    "              'Acc@1 {top1.val:.3f} ({top1.avg:.3f})'.format(\n",
    "               epoch, i, len(train_loader), batch_time=batch_time,\n",
    "               data_time=data_time, loss=losses, top1=top1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def validate(val_loader, model, criterion, epoch):\n",
    "    batch_time = AverageMeter()\n",
    "    losses = AverageMeter()\n",
    "    top0 = AverageMeter()\n",
    "    top1 = AverageMeter()\n",
    "    # top5 = AverageMeter()\n",
    "\n",
    "    # switch to evaluate mode\n",
    "    model.eval()\n",
    "\n",
    "    with torch.no_grad():\n",
    "        end = time.time()\n",
    "        for i, (inputs, labels) in enumerate(val_loader):\n",
    "\n",
    "            inputs = inputs.to(device)\n",
    "            labels = labels.to(device)\n",
    "\n",
    "            # compute output\n",
    "            outputs = model(inputs)\n",
    "            loss = criterion(outputs, labels)\n",
    "            \n",
    "            _, preds = torch.max(outputs, 1)\n",
    "\n",
    "            # measure accuracy and record loss\n",
    "            \n",
    "            losses.update(loss.item(), inputs.size(0))\n",
    "            top1.update(torch.sum(preds == labels.data).double()/inputs.size(0), inputs.size(0))\n",
    "\n",
    "            # measure elapsed time\n",
    "            batch_time.update(time.time() - end)\n",
    "            end = time.time()\n",
    "\n",
    "            if i % print_freq == 0:\n",
    "                print('Test: [{0}/{1}]\\t'\n",
    "                  'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\\t'\n",
    "                  'Loss {loss.val:.4f} ({loss.avg:.4f})\\t'\n",
    "                  'Acc@1 {top1.val:.3f} ({top1.avg:.3f})'.format(\n",
    "                   i, len(val_loader), batch_time=batch_time, loss=losses,\n",
    "                   top1=top1))\n",
    "            \n",
    "        print(' * Acc@1 {top1.avg:.3f}'.format(top1=top1))\n",
    "\n",
    "    return top1.avg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "model = model.to(device)\n",
    "\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "\n",
    "# Observe that all parameters are being optimized\n",
    "# optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n",
    "\n",
    "# Decay LR by a factor of 0.5 every 5 epochs\n",
    "# exp_scheduler = lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.5)\n",
    "\n",
    "optimizer = optim.Adam(model.parameters(), lr=0.001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true,
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: [0][0/100]\tTime 0.207 (0.207)\tData 0.006 (0.006)\tLoss 2.6637 (2.6637)\tAcc@1 0.000 (0.000)\n",
      "Epoch: [0][50/100]\tTime 0.155 (0.163)\tData 0.003 (0.003)\tLoss 1.1796 (1.8778)\tAcc@1 0.562 (0.369)\n",
      "Test: [0/25]\tTime 0.179 (0.179)\tLoss 2.5726 (2.5726)\tAcc@1 0.312 (0.312)\n",
      " * Acc@1 0.535\n",
      "Epoch: [1][0/100]\tTime 0.140 (0.140)\tData 0.004 (0.004)\tLoss 0.8599 (0.8599)\tAcc@1 0.562 (0.562)\n",
      "Epoch: [1][50/100]\tTime 0.141 (0.158)\tData 0.003 (0.003)\tLoss 1.2343 (1.1281)\tAcc@1 0.500 (0.614)\n",
      "Test: [0/25]\tTime 0.138 (0.138)\tLoss 2.3202 (2.3202)\tAcc@1 0.438 (0.438)\n",
      " * Acc@1 0.530\n",
      "Epoch: [2][0/100]\tTime 0.134 (0.134)\tData 0.005 (0.005)\tLoss 1.3741 (1.3741)\tAcc@1 0.438 (0.438)\n",
      "Epoch: [2][50/100]\tTime 0.136 (0.161)\tData 0.002 (0.003)\tLoss 0.5923 (0.9135)\tAcc@1 0.750 (0.679)\n",
      "Test: [0/25]\tTime 0.137 (0.137)\tLoss 1.4060 (1.4060)\tAcc@1 0.375 (0.375)\n",
      " * Acc@1 0.527\n",
      "Epoch: [3][0/100]\tTime 0.140 (0.140)\tData 0.004 (0.004)\tLoss 1.2184 (1.2184)\tAcc@1 0.562 (0.562)\n",
      "Epoch: [3][50/100]\tTime 0.185 (0.159)\tData 0.002 (0.003)\tLoss 1.2633 (0.8911)\tAcc@1 0.625 (0.668)\n",
      "Test: [0/25]\tTime 0.152 (0.152)\tLoss 1.6055 (1.6055)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.580\n",
      "Epoch: [4][0/100]\tTime 0.148 (0.148)\tData 0.004 (0.004)\tLoss 1.3096 (1.3096)\tAcc@1 0.562 (0.562)\n",
      "Epoch: [4][50/100]\tTime 0.128 (0.137)\tData 0.002 (0.003)\tLoss 1.1013 (0.7808)\tAcc@1 0.562 (0.737)\n",
      "Test: [0/25]\tTime 0.123 (0.123)\tLoss 1.5842 (1.5842)\tAcc@1 0.688 (0.688)\n",
      " * Acc@1 0.530\n",
      "Epoch: [5][0/100]\tTime 0.189 (0.189)\tData 0.054 (0.054)\tLoss 1.0397 (1.0397)\tAcc@1 0.688 (0.688)\n",
      "Epoch: [5][50/100]\tTime 0.147 (0.138)\tData 0.002 (0.003)\tLoss 0.3671 (0.6840)\tAcc@1 0.875 (0.746)\n",
      "Test: [0/25]\tTime 0.133 (0.133)\tLoss 2.3382 (2.3382)\tAcc@1 0.375 (0.375)\n",
      " * Acc@1 0.540\n",
      "Epoch: [6][0/100]\tTime 0.140 (0.140)\tData 0.005 (0.005)\tLoss 0.4138 (0.4138)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [6][50/100]\tTime 0.136 (0.136)\tData 0.003 (0.003)\tLoss 0.6248 (0.6512)\tAcc@1 0.688 (0.765)\n",
      "Test: [0/25]\tTime 0.127 (0.127)\tLoss 1.1397 (1.1397)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.557\n",
      "Epoch: [7][0/100]\tTime 0.133 (0.133)\tData 0.004 (0.004)\tLoss 0.7179 (0.7179)\tAcc@1 0.750 (0.750)\n",
      "Epoch: [7][50/100]\tTime 0.131 (0.138)\tData 0.003 (0.003)\tLoss 0.8640 (0.6696)\tAcc@1 0.625 (0.741)\n",
      "Test: [0/25]\tTime 0.154 (0.154)\tLoss 1.8843 (1.8843)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.555\n",
      "Epoch: [8][0/100]\tTime 0.135 (0.135)\tData 0.005 (0.005)\tLoss 0.6217 (0.6217)\tAcc@1 0.688 (0.688)\n",
      "Epoch: [8][50/100]\tTime 0.137 (0.137)\tData 0.003 (0.002)\tLoss 0.7956 (0.5780)\tAcc@1 0.812 (0.799)\n",
      "Test: [0/25]\tTime 0.142 (0.142)\tLoss 1.5833 (1.5833)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.555\n",
      "Epoch: [9][0/100]\tTime 0.136 (0.136)\tData 0.004 (0.004)\tLoss 0.3795 (0.3795)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [9][50/100]\tTime 0.133 (0.137)\tData 0.002 (0.002)\tLoss 0.8071 (0.6534)\tAcc@1 0.625 (0.737)\n",
      "Test: [0/25]\tTime 0.146 (0.146)\tLoss 1.2349 (1.2349)\tAcc@1 0.750 (0.750)\n",
      " * Acc@1 0.557\n",
      "Epoch: [10][0/100]\tTime 0.140 (0.140)\tData 0.005 (0.005)\tLoss 0.4930 (0.4930)\tAcc@1 0.750 (0.750)\n",
      "Epoch: [10][50/100]\tTime 0.139 (0.137)\tData 0.002 (0.002)\tLoss 0.9150 (0.6354)\tAcc@1 0.750 (0.775)\n",
      "Test: [0/25]\tTime 0.138 (0.138)\tLoss 0.7562 (0.7562)\tAcc@1 0.688 (0.688)\n",
      " * Acc@1 0.547\n",
      "Epoch: [11][0/100]\tTime 0.137 (0.137)\tData 0.004 (0.004)\tLoss 0.1735 (0.1735)\tAcc@1 0.938 (0.938)\n",
      "Epoch: [11][50/100]\tTime 0.139 (0.136)\tData 0.003 (0.003)\tLoss 0.7904 (0.5671)\tAcc@1 0.812 (0.797)\n",
      "Test: [0/25]\tTime 0.145 (0.145)\tLoss 1.6592 (1.6592)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.540\n",
      "Epoch: [12][0/100]\tTime 0.136 (0.136)\tData 0.004 (0.004)\tLoss 0.6102 (0.6102)\tAcc@1 0.688 (0.688)\n",
      "Epoch: [12][50/100]\tTime 0.141 (0.137)\tData 0.002 (0.002)\tLoss 0.4532 (0.5992)\tAcc@1 0.812 (0.797)\n",
      "Test: [0/25]\tTime 0.139 (0.139)\tLoss 1.6972 (1.6972)\tAcc@1 0.438 (0.438)\n",
      " * Acc@1 0.570\n",
      "Epoch: [13][0/100]\tTime 0.141 (0.141)\tData 0.005 (0.005)\tLoss 0.1053 (0.1053)\tAcc@1 0.938 (0.938)\n",
      "Epoch: [13][50/100]\tTime 0.135 (0.136)\tData 0.002 (0.002)\tLoss 0.2860 (0.5464)\tAcc@1 0.938 (0.809)\n",
      "Test: [0/25]\tTime 0.141 (0.141)\tLoss 2.0522 (2.0522)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.560\n",
      "Epoch: [14][0/100]\tTime 0.132 (0.132)\tData 0.004 (0.004)\tLoss 1.1154 (1.1154)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [14][50/100]\tTime 0.151 (0.138)\tData 0.002 (0.002)\tLoss 0.0249 (0.5642)\tAcc@1 1.000 (0.797)\n",
      "Test: [0/25]\tTime 0.140 (0.140)\tLoss 1.3646 (1.3646)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.545\n",
      "Epoch: [15][0/100]\tTime 0.140 (0.140)\tData 0.004 (0.004)\tLoss 0.2030 (0.2030)\tAcc@1 0.938 (0.938)\n",
      "Epoch: [15][50/100]\tTime 0.141 (0.136)\tData 0.002 (0.002)\tLoss 0.5138 (0.5525)\tAcc@1 0.812 (0.795)\n",
      "Test: [0/25]\tTime 0.130 (0.130)\tLoss 1.0119 (1.0119)\tAcc@1 0.688 (0.688)\n",
      " * Acc@1 0.547\n",
      "Epoch: [16][0/100]\tTime 0.128 (0.128)\tData 0.005 (0.005)\tLoss 0.6047 (0.6047)\tAcc@1 0.812 (0.812)\n",
      "Epoch: [16][50/100]\tTime 0.141 (0.137)\tData 0.003 (0.003)\tLoss 0.9904 (0.5613)\tAcc@1 0.688 (0.800)\n",
      "Test: [0/25]\tTime 0.130 (0.130)\tLoss 2.1661 (2.1661)\tAcc@1 0.375 (0.375)\n",
      " * Acc@1 0.545\n",
      "Epoch: [17][0/100]\tTime 0.141 (0.141)\tData 0.005 (0.005)\tLoss 0.1568 (0.1568)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [17][50/100]\tTime 0.135 (0.137)\tData 0.002 (0.002)\tLoss 1.0553 (0.5586)\tAcc@1 0.625 (0.810)\n",
      "Test: [0/25]\tTime 0.138 (0.138)\tLoss 1.7899 (1.7899)\tAcc@1 0.375 (0.375)\n",
      " * Acc@1 0.570\n",
      "Epoch: [18][0/100]\tTime 0.141 (0.141)\tData 0.004 (0.004)\tLoss 0.6139 (0.6139)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [18][50/100]\tTime 0.133 (0.136)\tData 0.002 (0.002)\tLoss 0.4749 (0.5873)\tAcc@1 0.875 (0.795)\n",
      "Test: [0/25]\tTime 0.138 (0.138)\tLoss 1.8844 (1.8844)\tAcc@1 0.500 (0.500)\n",
      " * Acc@1 0.550\n",
      "Epoch: [19][0/100]\tTime 0.139 (0.139)\tData 0.004 (0.004)\tLoss 0.6458 (0.6458)\tAcc@1 0.812 (0.812)\n",
      "Epoch: [19][50/100]\tTime 0.133 (0.136)\tData 0.002 (0.002)\tLoss 1.1729 (0.5266)\tAcc@1 0.688 (0.821)\n",
      "Test: [0/25]\tTime 0.137 (0.137)\tLoss 2.5226 (2.5226)\tAcc@1 0.500 (0.500)\n",
      " * Acc@1 0.530\n",
      "Epoch: [20][0/100]\tTime 0.140 (0.140)\tData 0.005 (0.005)\tLoss 0.2693 (0.2693)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [20][50/100]\tTime 0.141 (0.143)\tData 0.003 (0.003)\tLoss 0.8415 (0.5023)\tAcc@1 0.625 (0.812)\n",
      "Test: [0/25]\tTime 0.134 (0.134)\tLoss 2.4410 (2.4410)\tAcc@1 0.438 (0.438)\n",
      " * Acc@1 0.535\n",
      "Epoch: [21][0/100]\tTime 0.133 (0.133)\tData 0.004 (0.004)\tLoss 0.3129 (0.3129)\tAcc@1 0.938 (0.938)\n",
      "Epoch: [21][50/100]\tTime 0.124 (0.137)\tData 0.002 (0.002)\tLoss 1.1967 (0.4909)\tAcc@1 0.562 (0.836)\n",
      "Test: [0/25]\tTime 0.134 (0.134)\tLoss 2.1334 (2.1334)\tAcc@1 0.375 (0.375)\n",
      " * Acc@1 0.552\n",
      "Epoch: [22][0/100]\tTime 0.151 (0.151)\tData 0.005 (0.005)\tLoss 0.6959 (0.6959)\tAcc@1 0.812 (0.812)\n",
      "Epoch: [22][50/100]\tTime 0.130 (0.137)\tData 0.002 (0.002)\tLoss 0.3450 (0.4851)\tAcc@1 0.812 (0.826)\n",
      "Test: [0/25]\tTime 0.134 (0.134)\tLoss 1.7525 (1.7525)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.520\n",
      "Epoch: [23][0/100]\tTime 0.142 (0.142)\tData 0.005 (0.005)\tLoss 0.6881 (0.6881)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [23][50/100]\tTime 0.140 (0.137)\tData 0.003 (0.002)\tLoss 0.2946 (0.5152)\tAcc@1 0.875 (0.831)\n",
      "Test: [0/25]\tTime 0.127 (0.127)\tLoss 1.3503 (1.3503)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.532\n",
      "Epoch: [24][0/100]\tTime 0.132 (0.132)\tData 0.004 (0.004)\tLoss 0.3237 (0.3237)\tAcc@1 0.812 (0.812)\n",
      "Epoch: [24][50/100]\tTime 0.145 (0.137)\tData 0.002 (0.003)\tLoss 0.4624 (0.4939)\tAcc@1 0.812 (0.812)\n",
      "Test: [0/25]\tTime 0.147 (0.147)\tLoss 2.1307 (2.1307)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.542\n",
      "Epoch: [25][0/100]\tTime 0.139 (0.139)\tData 0.004 (0.004)\tLoss 0.7716 (0.7716)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [25][50/100]\tTime 0.133 (0.138)\tData 0.002 (0.002)\tLoss 0.2012 (0.5689)\tAcc@1 0.938 (0.799)\n",
      "Test: [0/25]\tTime 0.139 (0.139)\tLoss 2.8871 (2.8871)\tAcc@1 0.500 (0.500)\n",
      " * Acc@1 0.560\n",
      "Epoch: [26][0/100]\tTime 0.140 (0.140)\tData 0.004 (0.004)\tLoss 0.7017 (0.7017)\tAcc@1 0.812 (0.812)\n",
      "Epoch: [26][50/100]\tTime 0.132 (0.137)\tData 0.002 (0.002)\tLoss 0.6595 (0.4851)\tAcc@1 0.688 (0.826)\n",
      "Test: [0/25]\tTime 0.131 (0.131)\tLoss 3.2517 (3.2517)\tAcc@1 0.438 (0.438)\n",
      " * Acc@1 0.545\n",
      "Epoch: [27][0/100]\tTime 0.126 (0.126)\tData 0.004 (0.004)\tLoss 0.3301 (0.3301)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [27][50/100]\tTime 0.140 (0.137)\tData 0.003 (0.002)\tLoss 0.5460 (0.4327)\tAcc@1 0.875 (0.846)\n",
      "Test: [0/25]\tTime 0.130 (0.130)\tLoss 1.4195 (1.4195)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.542\n",
      "Epoch: [28][0/100]\tTime 0.141 (0.141)\tData 0.005 (0.005)\tLoss 0.4862 (0.4862)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [28][50/100]\tTime 0.137 (0.142)\tData 0.003 (0.003)\tLoss 0.3824 (0.4462)\tAcc@1 0.875 (0.844)\n",
      "Test: [0/25]\tTime 0.121 (0.121)\tLoss 2.6971 (2.6971)\tAcc@1 0.500 (0.500)\n",
      " * Acc@1 0.537\n",
      "Epoch: [29][0/100]\tTime 0.149 (0.149)\tData 0.004 (0.004)\tLoss 0.3355 (0.3355)\tAcc@1 0.750 (0.750)\n",
      "Epoch: [29][50/100]\tTime 0.133 (0.137)\tData 0.002 (0.002)\tLoss 0.8407 (0.5527)\tAcc@1 0.750 (0.822)\n",
      "Test: [0/25]\tTime 0.127 (0.127)\tLoss 1.4636 (1.4636)\tAcc@1 0.688 (0.688)\n",
      " * Acc@1 0.545\n"
     ]
    }
   ],
   "source": [
    "# 把model 最后一层（全连接层）训练一下， 其他层冻结\n",
    "for epoch in range(0,30):\n",
    "    train(train_loader, model, criterion, optimizer, epoch)\n",
    "    acc = validate(val_loader, model, criterion, epoch)\n",
    "    # print(\"accuracy = {}\".format(acc.item()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "feature_space = feature_space.to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size,\n",
    "    sampler=train_sampler, num_workers=num_workers)\n",
    "val_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size,\n",
    "    sampler=valid_sampler, num_workers=num_workers)\n",
    "\n",
    "nth_target = 0\n",
    "i = nth_target\n",
    "for instances,labels in iter(val_loader):\n",
    "    if len(instances) < i:\n",
    "        i-=len(instances)\n",
    "    else:\n",
    "        target_instance = instances[i]\n",
    "        target_label = labels[i]\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "imshow(target_instance)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "6"
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "target_label.item()  # xa"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "flag = False\n",
    "for instances,labels in iter(train_loader):\n",
    "    for i in range(len(instances)):\n",
    "        if labels[i].item() != target_label.item():\n",
    "            base_instance = instances[0]\n",
    "            base_label = labels[i]\n",
    "            flag = True\n",
    "            break\n",
    "    if flag:\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "imshow(base_instance) #xb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "5"
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "base_label.item()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 让f(x)的层可以训练\n",
    "feature_space = feature_space.to(device)\n",
    "for name, module in feature_space.named_modules():\n",
    "    for param in module.parameters():\n",
    "        param.requires_grad = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "target_instance = target_instance.to(device)\n",
    "base_instance = base_instance.to(device)\n",
    "feature_space = feature_space.to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def poison(feature_space, x, base_instance, target_instance, beta_0 = 0.1, lr=0.001):\n",
    "    \"\"\"\n",
    "    base_instance b\n",
    "    target_instance t\n",
    "    \"\"\"\n",
    "    \n",
    "    # x = x.to(device)\n",
    "    x.requires_grad = True\n",
    "    \n",
    "    feature_space.eval()\n",
    "\n",
    "    fs_t = feature_space(target_instance.view(1,*target_instance.shape)).detach()\n",
    "    fs_t.requires_grad = False\n",
    "\n",
    "    if model_name == 'vgg16':\n",
    "        beta = beta_0 * model.classifier[6].in_features**2/(3*224*224)**2\n",
    "    \n",
    "    # Forward Step:\n",
    "    dif = feature_space(x.view(1,*x.shape))-fs_t\n",
    "    loss = torch.sum(torch.mul(dif,dif))\n",
    "    loss.backward()\n",
    "\n",
    "    x2 = x.clone()\n",
    "    x2-= (x.grad*lr)\n",
    "\n",
    "    # Backward Step:\n",
    "    x = (x2+lr*beta*base_instance)/(1+lr*beta)\n",
    "    \n",
    "    return x, loss.item()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5080.4111328125\n",
      "429.63275146484375\n",
      "234.3646697998047\n",
      "187.9705810546875\n",
      "188.87928771972656\n",
      "161.4115447998047\n",
      "210.56298828125\n",
      "143.15101623535156\n",
      "155.55172729492188\n",
      "158.54373168945312\n",
      "139.0214385986328\n",
      "132.140625\n",
      "129.2542266845703\n",
      "128.4823760986328\n",
      "135.90548706054688\n",
      "124.47013854980469\n",
      "125.57853698730469\n",
      "135.6099090576172\n",
      "120.78108215332031\n",
      "121.68557739257812\n"
     ]
    }
   ],
   "source": [
    "x = base_instance\n",
    "for i in range(1000):\n",
    "    x, loss = poison(feature_space, x.detach(), base_instance, target_instance)\n",
    "    if i % 50 == 0:\n",
    "        print(loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "imshow(x.detach().cpu())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "imshow(base_instance.detach().cpu())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "class DataMask(object):\n",
    "    def __init__(self,data,mask):\n",
    "        self.data = data\n",
    "        self.mask = mask\n",
    "        self.size = 1\n",
    "        for s in data.shape:\n",
    "            self.size*=s\n",
    "\n",
    "    def get(self, data):\n",
    "        for i in range(len(data)):\n",
    "            if torch.sum(data[i] == self.data).item()==self.size:\n",
    "                data[i] = self.mask.detach()\n",
    "                print(\"Masked\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "dm = DataMask(base_instance.to('cpu'),x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "model = model.to(device)\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "\n",
    "\n",
    "optimizer = optim.Adam(model.parameters(), lr=0.001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: [0][0/100]\tTime 0.150 (0.150)\tData 0.004 (0.004)\tLoss 0.2454 (0.2454)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [0][50/100]\tTime 0.152 (0.145)\tData 0.002 (0.002)\tLoss 1.1736 (0.4547)\tAcc@1 0.562 (0.837)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.141 (0.141)\tLoss 3.4410 (3.4410)\tAcc@1 0.375 (0.375)\n",
      " * Acc@1 0.575\n",
      "Epoch: [1][0/100]\tTime 0.152 (0.152)\tData 0.005 (0.005)\tLoss 0.4167 (0.4167)\tAcc@1 0.875 (0.875)\n",
      "Masked\n",
      "Epoch: [1][50/100]\tTime 0.155 (0.144)\tData 0.003 (0.003)\tLoss 1.1720 (0.5212)\tAcc@1 0.562 (0.821)\n",
      "Test: [0/25]\tTime 0.139 (0.139)\tLoss 1.9705 (1.9705)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.565\n",
      "Epoch: [2][0/100]\tTime 0.133 (0.133)\tData 0.004 (0.004)\tLoss 0.2634 (0.2634)\tAcc@1 0.938 (0.938)\n",
      "Masked\n",
      "Epoch: [2][50/100]\tTime 0.152 (0.145)\tData 0.003 (0.003)\tLoss 0.9024 (0.4783)\tAcc@1 0.812 (0.855)\n",
      "Test: [0/25]\tTime 0.138 (0.138)\tLoss 2.2275 (2.2275)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.537\n",
      "Epoch: [3][0/100]\tTime 0.140 (0.140)\tData 0.004 (0.004)\tLoss 0.2148 (0.2148)\tAcc@1 0.938 (0.938)\n",
      "Masked\n",
      "Epoch: [3][50/100]\tTime 0.138 (0.144)\tData 0.003 (0.003)\tLoss 0.4381 (0.4699)\tAcc@1 0.875 (0.847)\n",
      "Test: [0/25]\tTime 0.151 (0.151)\tLoss 3.4085 (3.4085)\tAcc@1 0.438 (0.438)\n",
      " * Acc@1 0.540\n",
      "Epoch: [4][0/100]\tTime 0.142 (0.142)\tData 0.004 (0.004)\tLoss 0.5534 (0.5534)\tAcc@1 0.750 (0.750)\n",
      "Epoch: [4][50/100]\tTime 0.136 (0.144)\tData 0.003 (0.002)\tLoss 0.3957 (0.4394)\tAcc@1 0.875 (0.866)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.176 (0.176)\tLoss 4.7623 (4.7623)\tAcc@1 0.375 (0.375)\n",
      " * Acc@1 0.532\n",
      "Epoch: [5][0/100]\tTime 0.177 (0.177)\tData 0.004 (0.004)\tLoss 0.1383 (0.1383)\tAcc@1 0.938 (0.938)\n",
      "Masked\n",
      "Epoch: [5][50/100]\tTime 0.148 (0.160)\tData 0.002 (0.003)\tLoss 1.0374 (0.4705)\tAcc@1 0.750 (0.850)\n",
      "Test: [0/25]\tTime 0.160 (0.160)\tLoss 3.4182 (3.4182)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.570\n",
      "Epoch: [6][0/100]\tTime 0.163 (0.163)\tData 0.004 (0.004)\tLoss 0.6975 (0.6975)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [6][50/100]\tTime 0.164 (0.163)\tData 0.003 (0.003)\tLoss 0.9523 (0.4878)\tAcc@1 0.812 (0.852)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.156 (0.156)\tLoss 2.5842 (2.5842)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.540\n",
      "Epoch: [7][0/100]\tTime 0.165 (0.165)\tData 0.004 (0.004)\tLoss 0.1486 (0.1486)\tAcc@1 0.938 (0.938)\n",
      "Epoch: [7][50/100]\tTime 0.170 (0.175)\tData 0.002 (0.003)\tLoss 0.4156 (0.5509)\tAcc@1 0.875 (0.827)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.171 (0.171)\tLoss 2.0039 (2.0039)\tAcc@1 0.500 (0.500)\n",
      " * Acc@1 0.550\n",
      "Epoch: [8][0/100]\tTime 0.193 (0.193)\tData 0.005 (0.005)\tLoss 0.3247 (0.3247)\tAcc@1 0.875 (0.875)\n",
      "Masked\n",
      "Epoch: [8][50/100]\tTime 0.174 (0.178)\tData 0.003 (0.003)\tLoss 0.4144 (0.4908)\tAcc@1 0.875 (0.843)\n",
      "Test: [0/25]\tTime 0.172 (0.172)\tLoss 1.3739 (1.3739)\tAcc@1 0.812 (0.812)\n",
      " * Acc@1 0.542\n",
      "Epoch: [9][0/100]\tTime 0.173 (0.173)\tData 0.004 (0.004)\tLoss 0.2235 (0.2235)\tAcc@1 0.938 (0.938)\n",
      "Masked\n",
      "Epoch: [9][50/100]\tTime 0.170 (0.168)\tData 0.004 (0.003)\tLoss 0.1388 (0.4785)\tAcc@1 0.938 (0.850)\n",
      "Test: [0/25]\tTime 0.162 (0.162)\tLoss 1.4221 (1.4221)\tAcc@1 0.812 (0.812)\n",
      " * Acc@1 0.555\n",
      "Epoch: [10][0/100]\tTime 0.166 (0.166)\tData 0.005 (0.005)\tLoss 0.7800 (0.7800)\tAcc@1 0.750 (0.750)\n",
      "Masked\n",
      "Epoch: [10][50/100]\tTime 0.172 (0.167)\tData 0.003 (0.003)\tLoss 0.1413 (0.5094)\tAcc@1 0.938 (0.839)\n",
      "Test: [0/25]\tTime 0.157 (0.157)\tLoss 1.9039 (1.9039)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.557\n",
      "Epoch: [11][0/100]\tTime 0.174 (0.174)\tData 0.005 (0.005)\tLoss 0.1869 (0.1869)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [11][50/100]\tTime 0.169 (0.168)\tData 0.003 (0.003)\tLoss 0.3038 (0.5108)\tAcc@1 0.812 (0.833)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.163 (0.163)\tLoss 2.1308 (2.1308)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.565\n",
      "Epoch: [12][0/100]\tTime 0.175 (0.175)\tData 0.006 (0.006)\tLoss 0.2270 (0.2270)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [12][50/100]\tTime 0.170 (0.169)\tData 0.003 (0.003)\tLoss 0.3002 (0.5074)\tAcc@1 0.750 (0.836)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.164 (0.164)\tLoss 2.8926 (2.8926)\tAcc@1 0.438 (0.438)\n",
      " * Acc@1 0.542\n",
      "Epoch: [13][0/100]\tTime 0.175 (0.175)\tData 0.006 (0.006)\tLoss 1.1423 (1.1423)\tAcc@1 0.750 (0.750)\n",
      "Epoch: [13][50/100]\tTime 0.172 (0.169)\tData 0.003 (0.003)\tLoss 1.2032 (0.5017)\tAcc@1 0.750 (0.844)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.163 (0.163)\tLoss 1.8617 (1.8617)\tAcc@1 0.500 (0.500)\n",
      " * Acc@1 0.537\n",
      "Epoch: [14][0/100]\tTime 0.179 (0.179)\tData 0.006 (0.006)\tLoss 0.5286 (0.5286)\tAcc@1 0.812 (0.812)\n",
      "Masked\n",
      "Epoch: [14][50/100]\tTime 0.163 (0.169)\tData 0.003 (0.003)\tLoss 0.3227 (0.4673)\tAcc@1 0.938 (0.849)\n",
      "Test: [0/25]\tTime 0.169 (0.169)\tLoss 2.1608 (2.1608)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.555\n",
      "Epoch: [15][0/100]\tTime 0.170 (0.170)\tData 0.005 (0.005)\tLoss 0.1249 (0.1249)\tAcc@1 0.938 (0.938)\n",
      "Epoch: [15][50/100]\tTime 0.172 (0.171)\tData 0.003 (0.003)\tLoss 0.5195 (0.4261)\tAcc@1 0.875 (0.848)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.174 (0.174)\tLoss 4.0164 (4.0164)\tAcc@1 0.500 (0.500)\n",
      " * Acc@1 0.532\n",
      "Epoch: [16][0/100]\tTime 0.176 (0.176)\tData 0.005 (0.005)\tLoss 0.4755 (0.4755)\tAcc@1 0.938 (0.938)\n",
      "Epoch: [16][50/100]\tTime 0.166 (0.168)\tData 0.003 (0.003)\tLoss 0.6842 (0.4342)\tAcc@1 0.812 (0.857)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.160 (0.160)\tLoss 1.9868 (1.9868)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.545\n",
      "Epoch: [17][0/100]\tTime 0.166 (0.166)\tData 0.006 (0.006)\tLoss 0.1889 (0.1889)\tAcc@1 0.875 (0.875)\n",
      "Masked\n",
      "Epoch: [17][50/100]\tTime 0.168 (0.169)\tData 0.003 (0.003)\tLoss 0.1553 (0.4103)\tAcc@1 0.938 (0.869)\n",
      "Test: [0/25]\tTime 0.166 (0.166)\tLoss 2.0818 (2.0818)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.547\n",
      "Epoch: [18][0/100]\tTime 0.166 (0.166)\tData 0.005 (0.005)\tLoss 0.3665 (0.3665)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [18][50/100]\tTime 0.167 (0.166)\tData 0.002 (0.003)\tLoss 0.5939 (0.4960)\tAcc@1 0.875 (0.853)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.164 (0.164)\tLoss 3.3001 (3.3001)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.512\n",
      "Epoch: [19][0/100]\tTime 0.188 (0.188)\tData 0.005 (0.005)\tLoss 0.5613 (0.5613)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [19][50/100]\tTime 0.164 (0.168)\tData 0.002 (0.003)\tLoss 0.5136 (0.4857)\tAcc@1 0.875 (0.853)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.162 (0.162)\tLoss 1.6841 (1.6841)\tAcc@1 0.438 (0.438)\n",
      " * Acc@1 0.522\n",
      "Epoch: [20][0/100]\tTime 0.162 (0.162)\tData 0.006 (0.006)\tLoss 0.4512 (0.4512)\tAcc@1 0.750 (0.750)\n",
      "Epoch: [20][50/100]\tTime 0.168 (0.164)\tData 0.003 (0.003)\tLoss 0.5565 (0.4357)\tAcc@1 0.812 (0.866)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.159 (0.159)\tLoss 2.1778 (2.1778)\tAcc@1 0.688 (0.688)\n",
      " * Acc@1 0.515\n",
      "Epoch: [21][0/100]\tTime 0.166 (0.166)\tData 0.005 (0.005)\tLoss 0.7858 (0.7858)\tAcc@1 0.750 (0.750)\n",
      "Masked\n",
      "Epoch: [21][50/100]\tTime 0.166 (0.166)\tData 0.002 (0.003)\tLoss 0.3936 (0.4457)\tAcc@1 0.812 (0.858)\n",
      "Test: [0/25]\tTime 0.166 (0.166)\tLoss 1.4754 (1.4754)\tAcc@1 0.688 (0.688)\n",
      " * Acc@1 0.535\n",
      "Epoch: [22][0/100]\tTime 0.168 (0.168)\tData 0.005 (0.005)\tLoss 0.4049 (0.4049)\tAcc@1 0.875 (0.875)\n",
      "Masked\n",
      "Epoch: [22][50/100]\tTime 0.167 (0.167)\tData 0.004 (0.003)\tLoss 0.3153 (0.4526)\tAcc@1 0.938 (0.880)\n",
      "Test: [0/25]\tTime 0.163 (0.163)\tLoss 3.2472 (3.2472)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.522\n",
      "Epoch: [23][0/100]\tTime 0.169 (0.169)\tData 0.006 (0.006)\tLoss 0.8216 (0.8216)\tAcc@1 0.750 (0.750)\n",
      "Masked\n",
      "Epoch: [23][50/100]\tTime 0.165 (0.166)\tData 0.002 (0.003)\tLoss 0.7417 (0.4279)\tAcc@1 0.688 (0.862)\n",
      "Test: [0/25]\tTime 0.143 (0.143)\tLoss 1.4524 (1.4524)\tAcc@1 0.750 (0.750)\n",
      " * Acc@1 0.555\n",
      "Epoch: [24][0/100]\tTime 0.142 (0.142)\tData 0.005 (0.005)\tLoss 0.3076 (0.3076)\tAcc@1 0.875 (0.875)\n",
      "Epoch: [24][50/100]\tTime 0.142 (0.144)\tData 0.003 (0.003)\tLoss 0.3451 (0.4884)\tAcc@1 0.875 (0.854)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.140 (0.140)\tLoss 1.4893 (1.4893)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.535\n",
      "Epoch: [25][0/100]\tTime 0.143 (0.143)\tData 0.005 (0.005)\tLoss 0.3010 (0.3010)\tAcc@1 0.938 (0.938)\n",
      "Masked\n",
      "Epoch: [25][50/100]\tTime 0.149 (0.146)\tData 0.003 (0.002)\tLoss 0.4682 (0.4538)\tAcc@1 0.750 (0.854)\n",
      "Test: [0/25]\tTime 0.145 (0.145)\tLoss 2.5522 (2.5522)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.530\n",
      "Epoch: [26][0/100]\tTime 0.148 (0.148)\tData 0.004 (0.004)\tLoss 0.2977 (0.2977)\tAcc@1 0.812 (0.812)\n",
      "Masked\n",
      "Epoch: [26][50/100]\tTime 0.147 (0.146)\tData 0.002 (0.003)\tLoss 0.2590 (0.3925)\tAcc@1 0.812 (0.881)\n",
      "Test: [0/25]\tTime 0.143 (0.143)\tLoss 2.0168 (2.0168)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.532\n",
      "Epoch: [27][0/100]\tTime 0.153 (0.153)\tData 0.004 (0.004)\tLoss 0.1172 (0.1172)\tAcc@1 0.938 (0.938)\n",
      "Epoch: [27][50/100]\tTime 0.152 (0.146)\tData 0.003 (0.003)\tLoss 0.3861 (0.4446)\tAcc@1 0.875 (0.865)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.137 (0.137)\tLoss 2.5409 (2.5409)\tAcc@1 0.625 (0.625)\n",
      " * Acc@1 0.547\n",
      "Epoch: [28][0/100]\tTime 0.146 (0.146)\tData 0.004 (0.004)\tLoss 0.8160 (0.8160)\tAcc@1 0.812 (0.812)\n",
      "Masked\n",
      "Epoch: [28][50/100]\tTime 0.149 (0.150)\tData 0.003 (0.003)\tLoss 0.6077 (0.4786)\tAcc@1 0.812 (0.879)\n",
      "Test: [0/25]\tTime 0.135 (0.135)\tLoss 2.9327 (2.9327)\tAcc@1 0.562 (0.562)\n",
      " * Acc@1 0.557\n",
      "Epoch: [29][0/100]\tTime 0.160 (0.160)\tData 0.005 (0.005)\tLoss 0.2670 (0.2670)\tAcc@1 0.938 (0.938)\n",
      "Epoch: [29][50/100]\tTime 0.148 (0.145)\tData 0.003 (0.003)\tLoss 0.0884 (0.4912)\tAcc@1 0.938 (0.843)\n",
      "Masked\n",
      "Test: [0/25]\tTime 0.141 (0.141)\tLoss 1.6147 (1.6147)\tAcc@1 0.688 (0.688)\n",
      " * Acc@1 0.537\n"
     ]
    }
   ],
   "source": [
    "for epoch in range(0,30):\n",
    "    train(train_loader, model, criterion, optimizer, epoch, dm)\n",
    "    acc = validate(val_loader, model, criterion, epoch)\n",
    "    # print(\"accuracy = {}\".format(acc.item()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def predict(inp):\n",
    "    _, preds = torch.max(model(inp.view(1,*inp.shape)),1)\n",
    "    return preds[0].item()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "5"
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predict(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "5"
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predict(base_instance)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "5"
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predict(target_instance)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}